INCLUDE Irvine32.inc

.data

nomeArqEntrada BYTE "RGB.pnm", 0
nomeArqSaida BYTE "RGB_GF2.pnm", 0
primeiraImagem BYTE 307217 DUP (?) ; O SUFICIENTE PARA UMA IMAGEM 640x480
segundaImagem BYTE 307217 DUP (?) ; O SUFICIENTE PARA UMA IMAGEM 640x480
largura DWORD 0
altura DWORD 0

.code

capturaNumeroDec PROC

    mov bl, primeiraImagem[esi]
    sub ebx, 30h; PRA TIRAR O ASCII DELE
    mov edx, esi ; FAZ UMA COPIA DE ONDE ESTAH O ESI
formaNumeroDec:
    inc esi
    inc ecx
    mov al, primeiraImagem[esi] 
    cmp eax, 20h ; COMPARA PRA VER SE EH ESPACO
    jnz formaNumeroDec ; SE NAO FOR CONTINUA ATE FOR
    dec ecx ; POIS VAI TER A QUANTIDADE DE DIGITOS NO ECX, MAS SE MULTIPLICA CADA UM POR 10 VEZES A QUANT. DE DIGITOS QUE FALTAM
    mov esi, edx ; DEVOLVENDO O VALOR
    cmp ecx, 0 ; SE NAO PRECISAR MULTIPLICAR POR POTENCIA DE 10 NAO ENTRA NO LOOP
    jz retornaNumero
acertaDigito:
    mov eax, ebx
    shl eax, 3 ; MULTIPLICA POR 8
    shl ebx, 1 ; MULTIPLICA POR 2
    add ebx, eax ; SOMA O VALOR DE EAX COM EBX, RESULTANDO EM UMA MULTIPLICACAO POR 10
    loop acertaDigito
retornaNumero:

    ret
capturaNumeroDec ENDP

LargAlt PROC

    mov ebx, 0
    mov eax, esi; AQUI PRA VER O RESTO
geraCoordLarg:
    mov ecx, 0
    call capturaNumeroDec
    add largura, ebx
    inc esi
    mov ebx, 20h
    cmp bl, primeiraImagem[esi] ; VER SE EH ESPACO
    jnz geraCoordLarg
	
    inc esi ; PRA IR PRO PRIMEIRO DIGITO DO SEGUNDO NUMERO 
    mov eax, esi ; AQUI PRA VER O RESTO
geraCoordAlt:
    mov ecx, 0
    call capturaNumeroDec
    add altura, ebx
    inc esi
    mov ebx, 20h
    cmp bl, primeiraImagem[esi] ; VER SE EH ESPACO
    jnz geraCoordAlt

    ret
LargAlt ENDP

GrayscaleFilter PROC

converterGsF:
    mov al, primeiraImagem[esi]
    inc esi
    mov bl, primeiraImagem[esi]
    add eax, ebx
    add eax, ebx
    inc esi
    mov bl, primeiraImagem[esi]
    inc esi
    add eax, ebx
    shr eax, 2 ; DIVIDE POR 4
    mov edx, ecx ; FAZENDO UMA COPIA DO ECX
    mov ecx, 3
atribValoresSegIm:
    mov segundaImagem[edi], al
    inc edi
    loop atribValoresSegIm
    mov ecx, edx ; DEVOLVENDO O VALOR DE EDX
    mov eax, 0
    loop converterGsF

    ret
GrayscaleFilter ENDP

GrayFilter PROC

    mov edx, ecx ; FAZENDO UMA COPIA DO ECX
    shl ecx, 1 ; MULTIPLICA POR 2
    add ecx, edx ; SOMA O VALOR ORIGINAL DE ECX, RESULTANDO EM UMA MULTIPLICACAO POR 3 POIS CADA COR TEM 3 CANAIS
atribValoresGF:
    mov al, primeiraImagem[esi]
    add eax, 0FFh
    shr eax, 1 ; DIVIDE POR 2
    mov segundaImagem[esi], al
    inc esi
    mov eax, 0
    loop atribValoresGF	

    ret
GrayFilter ENDP

escrever PROC
    mov eax, 0
escLinha:
    inc esi
    mov al, primeiraImagem[esi]
    mov segundaImagem[esi], al
    cmp al, 0Ah
    jnz escLinha
    ret
escrever ENDP

main PROC
    mov eax, OFFSET segundaImagem ; USADO APENAS PARA SE LOCALIZAR NA JANELA MEMORY
    mov eax, 0
    mov edx, OFFSET nomeArqEntrada
    call OpenInputFile ; EAX RETORNA O FILE HANDLE

    push eax ; PARA FECHAR A IMAGEM LIDA
    mov ecx, LENGTHOF primeiraImagem
    mov edx, OFFSET primeiraImagem
    call ReadFromFile

    mov esi, 0
    dec esi ; MANDA COM -1 PARA NA FUNCAO ESCREVER MUDAR PRA 0
    call escrever

    mov edi, esi ; COPIA DO ESI
    inc esi  ; PARA PULAR O 0A
    call LargAlt

    mov esi, edi
    call escrever

    mov eax, largura
    mul altura
    mov ecx, eax
    mov edx, 0
    mov eax, 0
    mov ebx, 0
    inc esi  ; PARA PULAR O 0A
    mov edi, esi
    ;call GrayscaleFilter
    call GrayFilter

    mov segundaImagem[esi], 0Ah
    inc esi ; PARA GRAVAR O 0A NA IMAGEM
    mov eax, 0
    mov edx, OFFSET nomeArqSaida
    call CreateOutputFile
    mov edi, eax
    mov ecx, esi
    mov edx, OFFSET segundaImagem
    call WriteToFile
    mov eax, edi
    call CloseFile
    pop eax ; PARA FECHAR A IMAGEM LIDA
    call CloseFile

    exit
main ENDP

END main